/*
 * Imagem.cpp
 *
 *  Created on: 02/07/2011
 *      Author: Berg
 */

#ifndef IMAGEM_HPP_
#define IMAGEM_HPP_

#include <stdio.h>
#include <opencv.hpp>
#include <opencv2/core/core.hpp>
#include <vector>
#include <dirent.h>

class Imagem{

public:

	/**
	 * bandas B G R
	 */
	Imagem(IplImage* im);
	Imagem(int width, int height, int channels);

	~Imagem();

	int* getPixel(int i, int j);

	void setPixel(int i, int j, int* pixel);

	int get(int i, int j, int banda);

	void set(int i, int j, int banda, int value);

	int width();

	int widthStep();

	int height();

	int nChannels();

	int depth();

	Imagem* duplicate();

	IplImage* getIplImage();

	int getMin(int banda);

	int getMax(int banda);

	void setAllPixels(int r, int g, int b);

	void setAllPixels(int values);

	void setBlock(int x, int y, int w, int h, int r, int g, int b);

	void setBlock(int x, int y, int w, int h, int value);

	void setTriangulo(int x, int y , int w, int h, int cor);

	void binario();

	static Imagem* crop(Imagem* im, int x, int y, int width, int height);

	static Imagem* mean(Imagem* im, int raio);

	static Imagem* expandLevels(Imagem* im, int min, int max);

	static Imagem* mediaNImagens(Imagem **frameGroup, int n);

	static int* mediaQuadranteCentral(Imagem* image);

	static int* medianQuadranteCentral(Imagem* image);
	
	static int* normalizaCor(int* pixel);

	static int* cvScalar2IntVector(CvScalar pixel);

	static CvScalar intVector2CvScalar(int* pixel);

	static void analizaStart(Imagem *frame);

	static Imagem* normalizaCorImagem(Imagem* frame);

	Imagem* resize(int tamanho);

	void add(Imagem* nova, int i, int j);

private:

	//Imagem
	IplImage* image;

	//Array que se utiliza para manipular os dados
	uchar* dados;

	static void expandLevelsBandaLocal(Imagem* im, int min, int max , int banda);
	static void applyTable(Imagem* im, int table[], int banda);
	void desenhaTrianguloCheio( CvPoint* vertices, int cor);
};



#endif
